<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
<link rel="canonical" href="./" />

<!-- oktavia -->
<link rel="stylesheet" href="assets/searchstyle.css" type="text/css" />
<script src="search/jquery-1.9.1.min.js"></script>
<script src="search/oktavia-jquery-ui.js"></script>
<script src="search/oktavia-english-search.js"></script>
<!-- /oktavia -->

<link rel="stylesheet" href="assets/style.css" type="text/css" />

<title>H2O</title>
</head>
<body>
<div id="body">
<div id="top">

<h1><a href="index.html">H2O</a></h1>
the optimized HTTP/1.x, HTTP/2 server

<!-- oktavia -->
<form id="searchform">
<input class="search" type="search" name="search" id="search" results="5" value="" placeholder="Search" />
<div id="searchresult_box">
<div id="close_search_box">&times;</div>
<div id="searchresult_summary"></div>
<div id="searchresult"></div>
<div id="searchresult_nav"></div>
<span class="pr">Powered by <a href="https://github.com/shibukawa/oktavia">Oktavia</a></span>
</div>
</form>
<!-- /oktavia -->

</div>

<table id="menu">
<tr>
<td class="selected">Top</td>
<td><a href="install.html">Install</a></td>
<td><a href="configure.html">Configure</a></td>
<td><a href="faq.html">FAQ</a></td>
<td><a href="http://blog.kazuhooku.com/search/label/H2O" target="_blank">Blog</a></td>
<td><a href="http://github.com/h2o/h2o/" target="_blank">Source</a></td>
</tr>
</table>

<div id="main">



<h2>About H2O</h2>

<div>
H2O is a very fast HTTP server written in C. It can also be <a href="faq.html#libh2o">used as a library</a>.
</div>

<h3>Key Features</h3>

<ul>
<li>HTTP/1.0, HTTP/1.1
<ul>
<li>uses <a href="https://github.com/h2o/picohttpparser/">PicoHTTPParser</a></li>
</ul>
</li>
<li><a href="http://http2.github.io/">HTTP/2</a>
<ul>
<li>supports the final version<sup><a href="#note_1" id="#cite_1" title="also supports draft 14 and 16 for compatibility">1</sup></a></sup></li>
<li>negotiation methods: NPN, ALPN, Upgrade, direct</li>
<li>dependency and weight-based prioritization</li>
<li>server push</li>
</ul>
</li>
<li>WebSocket<sup><a href="#note_2" id="#cite_2" title="only usable at library level">2</sup></a></sup></li>
<li>TLS
<ul>
<li>uses OpenSSL or LibreSSL</li>
<li>forward secrecy</li>
<li>AEAD ciphers including the upcoming ones preferred by Google Chrome<sup><a href="#note_3" id="#cite_3" title="chacha20-poly1305; see also: Do the ChaCha: better mobile performance with cryptography">3</sup></a></sup></li>
<li>OCSP stapling<sup><a href="#note_4" id="#cite_4" title="automatically enabled">4</sup></a></sup></li>
<li>session resumption and session tickets<sup><a href="#note_5" id="#cite_5" title="internal memory is used as the storage">5</sup></a></sup></li>
</ul>
</li>
<li>static file serving
<ul>
<li>conditional GET using last-modified / etag</li>
<li>directory listing</li>
<li>mime-type configuration</li>
</ul>
</li>
<li>reverse proxy
<ul>
<li>HTTP/1.x only<sup><a href="#note_6" id="#cite_6" title="HTTPS is not supported">6</sup></a></sup></li>
<li>persistent upstream connection</li>
</ul>
</li>
<li>access-logging
<ul>
<li>apache-like format strings</li>
</ul>
</li>
<li>graceful restart and self-upgrade</li>
</ul>

<h3>Benchmark</h3>

<h4>Remote Benchmark</h4>

<div>
<p>
Below chart shows the scores recorded on Amazon EC2 running two c3.8xlarge instances (server and client) on a single network placement<sup><a href="#note_7" id="#cite_7" title="for reverse-proxy tests, another H2O process running on the same host was used as the upstream server">7</sup></a></sup>.
</p>
<div align="center">
<a href="assets/remotebench.png" target="_blank"><img src="assets/remotebench.png" width="400"></a>
</div>
</div>

<h4>Local Benchmarks</h4>

<div>
<p>
The scores (requests/second.core) were recorded on Ubuntu 14.04 (x86-64) / VMware Fusion 7.1.0 / OS X 10.9.5 / MacBook Pro 15" Early 2013.
</p>

<table>
<caption>HTTP/1.1<sup><a href="#note_8" id="#cite_8" title="used command: wrk -c 500 -d 30 -t 1; configuration file of nginx is here">8</sup></a></sup></caption>
<tr><th>Server \ size of content<th>6 bytes<th>4,096 bytes
<tr><td>h2o/0.9.0<td align="right">75,483<td align="right">59,673
<tr><td><a href="http://nginx.org/">nginx</a>/1.7.9<td align="right">37,289<td align="right">43,988
</table>

<table>
<caption>HTTP/2<sup><a href="#note_9" id="#cite_9" title="used command: h2load -c 500 -m 100 -n 2000000; configuration file of h2o is here">9</sup></a></sup></caption>
<tr><th>Server \ size of content<th>6 bytes<th>4,096 bytes
<tr><td>h2o/0.9.0<td align="right">272,300<td align="right">116,022
<tr><td>tiny-nghttpd (<a href="https://github.com/tatsuhiro-t/nghttp2/">nghttpd</a>@ab1dd11)<td align="right">198,018<td align="right">93,868
<tr><td><a href="https://github.com/matsumoto-r/trusterd">trusterd</a>@cff8e15<td align="right">167,306<td align="right">67,600
</table>

</div>



<div class="notes">
<h3>Notes:</h3>
<ol>
<li id="note_1">also supports draft 14 and 16 for compatibility</li>
<li id="note_2">only usable at library level</li>
<li id="note_3">chacha20-poly1305; see also: <a href="https://blog.cloudflare.com/do-the-chacha-better-mobile-performance-with-cryptography/">Do the ChaCha: better mobile performance with cryptography</a></li>
<li id="note_4">automatically enabled</li>
<li id="note_5">internal memory is used as the storage</li>
<li id="note_6">HTTPS is not supported</li>
<li id="note_7">for reverse-proxy tests, another H2O process running on the same host was used as the upstream server</li>
<li id="note_8">used command: <code><a href="https://github.com/wg/wrk">wrk</a> -c 500 -d 30 -t 1</code>; configuration file of nginx is <a href="https://gist.github.com/kazuho/c9c12021567e3ab83809">here</a></li>
<li id="note_9">used command: <code><a href="https://github.com/tatsuhiro-t/nghttp2/">h2load</a> -c 500 -m 100 -n 2000000</code>; configuration file of h2o is <a href="https://gist.github.com/kazuho/5966cafb40e4473a62f8">here</a></li>
</ol>
</div>

</div>
<div id="footer">
<p>
Copyright &copy; 2015 <a href="http://dena.com/intl/">DeNA Co., Ltd.</a> et al.
</p>
</div>
<script type="text/javascript">
if (location.protocol.match(/^https?/) && location.hostname == "h2o.github.io") {
  (function(i,s,o,g,r,a,m){i['GoogleAnalyticsObject']=r;i[r]=i[r]||function(){
    (i[r].q=i[r].q||[]).push(arguments)},i[r].l=1*new Date();a=s.createElement(o),
    m=s.getElementsByTagName(o)[0];a.async=1;a.src=g;m.parentNode.insertBefore(a,m)
    })(window,document,'script','//www.google-analytics.com/analytics.js','ga');
  ga('create', 'UA-19422636-3', 'auto');
  ga('send', 'pageview');
}
</script>
</body>
</html>
